package com.wyw.leetcode.learning.simple;

import java.util.HashMap;
import java.util.Map;

/**
 * leetcode topic 383
 *  赎金信
 *      给你两个字符串：ransomNote 和 magazine ，判断 ransomNote 能不能由 magazine 里面的字符构成。
 *      如果可以，返回 true ；否则返回 false 。
 *      magazine 中的每个字符只能在 ransomNote 中使用一次。
 *
 * @Author Mr Wu yewen.wu.china@gmail.com
 * @Date 2023/2/28 9:50
 */
public class Topic383 {

    public static void main(String[] args) {
        System.out.println(canConstruct("ab", "aa"));

    }

    /**
     * 哈希表
     * @param ransomNote
     * @param magazine
     * @return
     */
    public static boolean canConstruct(String ransomNote, String magazine) {
        Map<Character, Integer> map = new HashMap<>();
        for(char c: magazine.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        for (char c: ransomNote.toCharArray()) {
            if(map.get(c) == null || map.get(c) < 1) return false;
            map.put(c, map.get(c) - 1);
        }
        return true;
    }

    /**
     * 换成数组，本质还是哈希表思想
     * @param ransomNote
     * @param magazine
     * @return
     */
    public static boolean canConstruct1(String ransomNote, String magazine) {
        if (ransomNote.length() > magazine.length()) {
            return false;
        }
        int[] cnt = new int[26];
        for (char c : magazine.toCharArray()) {
            cnt[c - 'a']++;
        }
        for (char c : ransomNote.toCharArray()) {
            cnt[c - 'a']--;
            if(cnt[c - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }




}



